"""
@Author : 合肥一元数智教育科技有限公司
@Date :  2025/3/13 10:22
@Description :  如何实现不修改源代码实现函数功能的增强
python中可以使用装饰器来解决以上问题   装饰器的本质还是闭包
定义装饰器时 外部函数需要接收一个function类型的参数  , 参数就是需要增强业务的函数

闭包中如何定义内部函数
1. 内部函数的参数设置保持和原始函数一致
2. 内部函数直接返回原始函数的返回值

"""
import time


# 定义装饰器
def decorator(func):
    # 内部函数中 实现业务的增强
    def inner(teacher, course):
        print('---------上课时间到了----------')
        # 调用原始函数
        result = func(teacher, course)
        print('---------下课时间到了----------')
        return result

    return inner

"""
@decorator  # 等价 teach = decorator(teach)
def teach():
    print('正在上课....')
    time.sleep(2)  # 阻塞程序

"""


"""
@decorator
def teach(teacher,course):
    print(f'{teacher}正在上{course}课....')
    time.sleep(2)  # 阻塞程序

"""


# 教学
@decorator
def teach(teacher, course):
    print(f'{teacher}正在上{course}课....')
    time.sleep(2)  # 阻塞程序
    return f'{teacher}:{course}'


# 调用函数 返回inner()     改变了原始函数的调用方式
# teach = decorator(teach)
# teach()

# 通过使用装饰器语法糖  inner
# result = teach('王老师', 'python')
# print(result)
teach('王老师', 'python')

